//#include<stdio.h>
//#include<pthread.h>
//#include<unistd.h>
//
//int count = 0;
//void* Routine(void* arg) {
//  while(1) {
//    count++;
//    sleep(1);
//  }
//  pthread_exit((void*)0);
//}
//
//int main() {
//
//  pthread_t tid;
//  pthread_create(&tid, NULL, Routine, NULL);
//
//  while(1) {
//
//    printf("count:%d\n", count);
//    sleep(1);
//  }
//  pthread_join(tid, NULL);
//  return 0;
//}
//


//#include <stdio.h>
//#include <unistd.h>
//#include <pthread.h>
//
//int tickets = 1000;
//pthread_mutex_t mutex;
//void* TicketGrabbing(void* arg)
//{
//	const char* name = (char*)arg;
//	while (1){
//    pthread_mutex_lock(&mutex);
//		if(tickets > 0){ 
//			usleep(10000);
//			printf("[%s] get a ticket, left: %d\n", name, --tickets);
//      pthread_mutex_unlock(&mutex);
//		}
//		else{
//
//      pthread_mutex_unlock(&mutex);
//			break;
//		}
//	}
//	printf("%s quit!\n", name);
//	pthread_exit((void*)0);
//}
//int main()
//{
//  pthread_mutex_init(&mutex, NULL);
//	pthread_t t1, t2, t3, t4;
//	pthread_create(&t1, NULL, TicketGrabbing, (void*)"thread 1");
//	pthread_create(&t2, NULL, TicketGrabbing, (void*)"thread 2");
//	pthread_create(&t3, NULL, TicketGrabbing, (void*)"thread 3");
//	pthread_create(&t4, NULL, TicketGrabbing, (void*)"thread 4");
//	
//	pthread_join(t1, NULL);
//	pthread_join(t2, NULL);
//	pthread_join(t3, NULL);
//	pthread_join(t4, NULL);
//  pthread_mutex_destroy(&mutex);
//	return 0;
//}
//

//#include <stdio.h>
//#include <pthread.h>
//
//pthread_mutex_t mutex;
//void* Routine(void* arg)
//{
//	pthread_mutex_lock(&mutex);
//	pthread_mutex_lock(&mutex);
//	
//	pthread_exit((void*)0);
//}
//int main()
//{
//	pthread_t tid;
//	pthread_mutex_init(&mutex, NULL);
//	pthread_create(&tid, NULL, Routine, NULL);
//	
//	pthread_join(tid, NULL);
//	pthread_mutex_destroy(&mutex);
//	return 0;
//}


#include <iostream>
#include <cstdio>
#include <pthread.h>

pthread_mutex_t mutex;
pthread_cond_t cond;
void* Routine(void* arg)
{
	pthread_detach(pthread_self());
	std::cout << (char*)arg << " run..." << std::endl;
	while (true){
		pthread_cond_wait(&cond, &mutex); //阻塞在这里，直到被唤醒
		std::cout << (char*)arg << "活动..." << std::endl;
	}
}
int main()
{
	pthread_t t1, t2, t3;
	pthread_mutex_init(&mutex, nullptr);
	pthread_cond_init(&cond, nullptr);
	
	pthread_create(&t1, nullptr, Routine, (void*)"thread 1");
	pthread_create(&t2, nullptr, Routine, (void*)"thread 2");
	pthread_create(&t3, nullptr, Routine, (void*)"thread 3");
	
	while (true){
		getchar();
		pthread_cond_broadcast(&cond);
	}

	pthread_mutex_destroy(&mutex);
	pthread_cond_destroy(&cond);
	return 0;
}

